<?php
/**
 * Created by PhpStorm. User: ADun, Date: 14/12/8 上午10:56
 * Description:
 */
include_once __DIR__ . '/../Interface.Weixin.php';
/**
 * Class C微直达 微直达系统操作类, 非业务对象进行的操作, 都由系统来执行
 */
class C微直达 extends CBS {

    protected $vo信息中心;

    /**
     * @param C信息中心 $vo信息中心
     */
    function __construct(C信息中心 $vo信息中心){
        parent::__construct();
        $this->vo信息中心=$vo信息中心;
    }

    public static function responseNewUser($vs公众号APPID,$vi公众号Id)
    {
        $vo图文=new Cbo图文消息列表();
        $pageUrl=getTUrl('law-agree',$vs公众号APPID,$vi公众号Id);
        $imgUrl=G_SITE_BASE."/web/images/dxm2.jpg";
        $page2=getTUrl('search-pro',$vs公众号APPID,$vi公众号Id);
        $img2=G_SITE_BASE."/web/images/plus.png";
        $pageUser=getTUrl('personal-msg',$vs公众号APPID,$vi公众号Id);
        $imgUser=G_SITE_BASE."/web/images/user.png";
        $vo图文->ft添加图文消息(' ',' ',$pageUrl,$imgUrl);
        $vo图文->ft添加图文消息(' ','',$pageUrl,$imgUrl);
        //$vo图文->ft添加图文消息('注册完善我的用户信息','',$pageUser,$imgUser);
        $vo图文->ft添加图文消息(' ','',$page2,$img2);
        return $vo图文;
    }

    /**
     * 获取AccessToken
     * 对于一个微信公众号来讲，只能有一个统一的AccessToken，所以如果有多个服务器获取token，只能从同一个接口处取得。
     * @return object
     */
    public function getAccessToken()
    {
        /* wangpei,20150513
        //$this->lg->logDebug("---get AccessToken called---");
        $flag = $this->getServerFlag();

        //$this->lg->logDebug("---flag is:".$flag."---");

        //如果不是linhe服务器，则从服务器上取得AccessToken 否则从本地取
        if ($flag != G_SERVER_IP) {
            logger()->logDebug("---get page value from remote of:G_SERVER_IP---");

            $response = Tools::curl_get_contents(G_SITE_BASE.'/getAccessToken.php');

            if (!$response){
                    logger()->logError("---get AccessToken from server " . G_SERVER_IP . " failed---" );
                    return false;
                }
            return $response;
        }
        //--------------------end of get Access token from server
*/
        $curTime = time();

        //如果没有AccessToken记录则 从wx取得一个，并记录到数据库
        if (!$voParameters = $this->getAccessTokenOld()) {
            // echo "Token record not found!";

            logger()->logDebug("---no old record  found, create new one---");

            $newToken = $this->vo信息中心->vc公众号->getAccessTokenNew();
            if (!$newToken) {
                // echo "Error in getting access token from 微信 server!";
                logger()->logError("---Error in getting access token from 微信 server!---");
                return false;
            }

            //todo accessToken 的取值和保存需要优化

            $voParameters=new DoUniversalParameters();
            $voParameters->set_value($newToken);
            $voParameters->set_name('AccessToken');
            $voParameters->set_公众号ID($this->vo信息中心->vs公众号Id);
            $voParameters->set_公众号openID($this->vo信息中心->vs公众号OpenId);
            //$voParameters->set_update_time();

            $rst = $voParameters->save();

            //updated token record, current time will be updated automatically by DB
            if ($rst)
                return $newToken;
            else {
                logger()->logError("---Error while recode new access token!---");
                return FALSE;
            }
        }

        $lastTime = strtotime($voParameters->get_update_time());
        $token = $voParameters->get_value();

        $interval = $curTime - $lastTime;

        logger()->logDebug("---from last token record time:" . $interval . "---");

        // 小于微信规定的7200秒时间间隔，则返回当前access token，否则从微信服务器读取新的AccessToken，并记录到本地
        if ($interval < G_TOKEN_TIME) {
            return $token;
        } else {

            $newToken = $this->vo信息中心->vc公众号->getAccessTokenNew();
            if (!$newToken) {
                logger()->logError("failed getting access token from C微信 server!");
                return false;
            }

            if ($this->updateToken($newToken))
                return $newToken;
            else
                return FALSE;
        }
    }

    /**
     * 取得当前的AccessToken 本地磁盘文件取出7200秒之内的token，如果已经超过这个时间则从微信服务器取
     * 并保存下当前的Token和保存时间。
     * @return bool|DoUniversalParameters
     */
    private function getAccessTokenOld()
    {
        logger()->logDebug("--- getAccessTokenOld called---");

        //get old token from database table UniversalParameters
        logger()->logDebug("--- getAccessTokenOld ".$this->vo信息中心->vs公众号Id);
        $do=new DoUniversalParameters();
        $do->set_公众号ID($this->vo信息中心->vs公众号Id);
        $do->set_name('AccessToken');
        $ret=$do->loadByKeys($do->get属性数组());

//        $ret=$do->loadByKeys(array($do->get_name(false)=>'AccessToken'));

        logger()->logDebug("--- getAccessTokenOld returned".$do->get_value());

        if($ret) return $do;
        return false;
    }

    /**
     * 将更新后的accessToken 保存到数据库
     * @param $tkRecord
     * @return bool
     */
    private function updateToken($tkRecord)
    {
        logger()->logDebug("--- updateToken called---with #tkRecord:" . $tkRecord);

        if (!$tkRecord) {
            logger()->logError("---updateToken #tkRecord is null!");
            return false;
        }

        $rst = self::$pdo->update('UniversalParameters',['update_time'=>date('Y-m-d H:i:s',time()),'value'=>$tkRecord],['name'=>'AccessToken','公众号Id'=>$this->vo信息中心->vs公众号Id]);

        if (!$rst) {
            logger()->logError("---update AccessToken failed!---");
            return false;
        } else {
            return true;
        }
    }


    public function 给用户发送保存在线状态($va参数){
        $vo新闻=new Cbo图文消息列表();
        $title="离线通知";
        $va参数['publicnumber'] = $this->vo信息中心->vs公众号Id;
        $state=Tools::pack参数打包('morepost',$va参数);

        $url=G_SITE_BASE.'/business/index.php?state='.$state;
        $pictureUrl =  G_SITE_BASE.'/business/' . 'img/logoRed2s.jpg';
        $vo新闻->ft添加图文消息 ('💻'.$title.'💳', '', $url, ''); // 添加一条图文信息
        $vo新闻->ft添加图文消息('💳 请进入确认保持在线，否则将联系不到您!', '', $url, $pictureUrl);

        return $vo新闻;
    }


    public function 给用户发送语音课程信息($title,$文字,$课程id){
        Logger::getInstance()->logDebug2('给用户发送语音课程信息');
        Logger::getInstance()->logDebug2($title);
        Logger::getInstance()->logDebug2($文字);
        $vo新闻=new Cbo图文消息列表();
        $url = Tools::url('course','course_detail', array('id' => $课程id));

        $pictureUrl =  G_SITE_BASE.'/business/' . 'img/logoRed2.png';
        $vo新闻->ft添加图文消息 ('💻'.$title.'', '', $url, ''); // 添加一条图文信息
        $vo新闻->ft添加图文消息(''.$文字.'', '', $url, $pictureUrl);

        #Logger::getInstance()->logInfo("语音课程信息". var_export($vo新闻, true));
        return $vo新闻;
    }

    public function 给用户发送聊天信息($va参数,$title,$群名,$群id,$文件路径){
        $vo新闻=new Cbo图文消息列表();
        $va参数['publicnumber'] = $this->vo信息中心->vs公众号Id;
        $va参数['群id'] = $群id;
        $state=Tools::pack参数打包($文件路径,$va参数);

        $url=G_SITE_BASE.'/business/index.php?state='.$state;
        $pictureUrl =  G_SITE_BASE.'/business/' . 'img/logoRed2.png';
        $vo新闻->ft添加图文消息 ('💻'.$title.'', '', $url, ''); // 添加一条图文信息
        $vo新闻->ft添加图文消息(''.$群名.'', '', $url, $pictureUrl);

        return $vo新闻;
    }

    public function 给用户发送会议信息($va参数,$title,$群名,$文件路径){
        $vo新闻=new Cbo图文消息列表();
        $va参数['publicnumber'] = $this->vo信息中心->vs公众号Id;
        $state=Tools::pack参数打包($文件路径,$va参数);

        $url=G_SITE_BASE.'/business/index.php?state='.$state;
       // logger::getInstance()->logDebug2('页面url'.$url);
        $pictureUrl =  G_SITE_BASE.'/business/' . 'img/logoRed2.png';
        $vo新闻->ft添加图文消息 ('💻'.$title.'', '', $url, ''); // 添加一条图文信息
        $vo新闻->ft添加图文消息(''.$群名.'', '', $url, $pictureUrl);

        return $vo新闻;
    }

    public function 给用户发送商家定制功能($参数){

     //   $文章图片路径 = G_SITE_BASE.'/';
        $vo文章=new Cbo图文消息列表();

            foreach($参数['菜单响应']  as $key  => $value) {

                if($value->data['类型'] == "图文"){
                    $vo文章->ft添加图文消息($value->data['标题'],$value->data['description'],$value->data['文章url'],$value->data['图片url']);
                }

            }
        return $vo文章;
    }

    public function 添加要图文信息($咨询详情){

        //   $文章图片路径 = G_SITE_BASE.'/';
        $vo文章=new Cbo图文消息列表();

        foreach($咨询详情  as $key  => $value) {

            //if($value->data['类型'] == "图文"){
                $vo文章->ft添加图文消息($value->data['标题'],$value->data['description'],$value->data['文章url'],$value->data['图片url']);
           // }

        }
        return $vo文章;
    }

    //测试
    public function 添加要图文信息1($detail){

        //   $文章图片路径 = G_SITE_BASE.'/';
        $vo文章=new Cbo图文消息列表();


            $url = Tools::url('vote','index',array('id'=>$detail['id']));
            //if($value->data['类型'] == "图文"){
            $vo文章->ft添加图文消息("寻找最美儿科医生投票活动开始啦！",$detail['descript'],$url,G_SITE_BASE."/".$detail['img']);
            // }

        return $vo文章;
    }
//测试
    public function add_meet_message($detail, $url){
        $vo文章=new Cbo图文消息列表();
        $vo文章->ft添加图文消息("《".$detail['name']."》会议视频已发布","欢迎观看",$url,G_SITE_BASE."/".$detail['图片log']);
        return $vo文章;
    }

    public function 添加单条图文信息($咨询详情){
        $vo文章=new Cbo图文消息列表();

            $vo文章->ft添加图文消息($咨询详情['标题'],$咨询详情['description'],$咨询详情['文章url'],$咨询详情['图片url']);

        return $vo文章;
    }

    public function 将病历推送至管理人员($va参数,$文章id,$文章title){
        $vo新闻=new Cbo图文消息列表();
        $title=$va参数['菜单响应'];
        $va参数['publicnumber'] = $this->vo信息中心->vs公众号Id;
        $state=Tools::pack参数打包('Seller19BingliAS_show',$va参数);

        $url=G_SITE_BASE.'/business/index.php?state='.$state."&id=".$文章id;
        $pictureUrl =  G_SITE_BASE.'/business/' . 'img/logoRed2s.jpg';
        $vo新闻->ft添加图文消息 ('💻['.$_SESSION['vo用户数据']['name'].']'.$title.'', '', $url, ''); // 添加一条图文信息
        $vo新闻->ft添加图文消息('💳'.$文章title, '', $url, $pictureUrl);

        return $vo新闻;
    }

    public function 给用户分享病历($va参数,$病历id,$病历title){
        $vo新闻=new Cbo图文消息列表();
        $title=$va参数['菜单响应'];
        $va参数['publicnumber'] = $this->vo信息中心->vs公众号Id;
        $state=Tools::pack参数打包('Seller15record',$va参数);

        $url=G_SITE_BASE.'/business/index.php?state='.$state."&id=".$病历id;
        $pictureUrl =  G_SITE_BASE.'/business/' . 'img/logoRed2s.jpg';
        $vo新闻->ft添加图文消息 ('💻['.$_SESSION['vo用户数据']['name'].']'.$title.'', '', $url, ''); // 添加一条图文信息
        $vo新闻->ft添加图文消息('💳'.$病历title, '', $url, $pictureUrl);

        return $vo新闻;
    }

    function DeleteWeChatMenu(){
        $accTk = $this->getAccessToken();

        $ret = $this->vo信息中心->vc公众号-> DeleteMenu($accTk);
        return $ret;
    }

    function getTUrl1($state,$公众号APPID,$公众号id,$json=null){
        $url=urlencode(G_SITE_BASE."/business/wxtunnel.php?appid=".$公众号id);
        $pg= "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$公众号APPID}&redirect_uri={$url}&response_type=code&scope=snsapi_base&state={$state}#wechat_redirect";
        return $pg;
    }

    function getTUrl($state){
        $url=urlencode(G_WX_ROUTE_PAGE);
        $appId = $this->vo信息中心->vs公众号AppId;
        $pg= "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$appId}&redirect_uri={$url}&response_type=code&scope=snsapi_base&state={$state}#wechat_redirect";
        return $pg;
    }
    function GetWeChatMenu(){
        $accTk = $this->getAccessToken();

        $ret = $this->vo信息中心->vc公众号-> GetMenu($accTk);
        return $ret;
    }
    function DefineWeChatMenu($menuIn=null)
    {
      $icons="🔴";
        $url1=$this->getTUrl('myCards');
        $url2=$this->getTUrl('AllProductList');
        $url3=$this->getTUrl('shopList');
        $url4=$this->getTUrl('UserInfo');
        $url5=$this->getTUrl('SellerHome');
        $url6=$this->getTUrl('help');

        if($menuIn)
            $menu=$menuIn;
        else
            $menu = ' {
                     "button":[
                              {
                                   "name":"👜卡包 ",
                                   "sub_button":[
                                   {
                                       "type":"view",
                                       "name":"⭕ 我的卡包",
                                       "url":"'.$url1.'"
                                    },
                                    {
                                          "type":"scancode_waitmsg",
                                          "name":"⭕ 扫卡",
                                          "key":"MENU_SCAN1",
                                           "sub_button":[ ]
                                    },
                                    {
                                       "type":"click",
                                       "name":"⭕ 出示卡",
                                       "key":"MENU_USE_CARD"
                                    }
                                    ]
                               },
                              {
                                   "name":"🏦逛 ",
                                   "sub_button":[
                                   {
                                       "type":"view",
                                       "name":"⭕ 逛商铺",
                                       "url":"'.$url2.'"
                                    },
                                    {
                                       "type":"view",
                                       "name":"⭕ 看商品",
                                       "url":"'.$url3.'"
                                    }]
                               },
                               {
                                    "name":"🔴微直达",
                                   "sub_button":[
                                   {
                                          "type":"view",
                                          "name":"⭕ 我",
                                          "url":"'.$url4.'"
                                    },
                                    {
                                          "type":"location_select",
                                          "name":"⭕ 位置",
                                          "key":"MENU_LOCATION"
                                    },
                                    {
                                        "type":"view",
                                          "name":"⭕ 卖家中心",
                                          "url":"'.$url5.'"
                                    },
                                    {
                                          "type":"click",
                                          "name":"⭕ 结束对话",
                                          "key":"MENU_CLOSE"
                                    },
                                    {
                                        "type":"click",
                                        "name":"⭕ 帮助",
                                        "key":"MENU_HELP"
                                    }
                                    ]
                               }
                     ]
                 }';
        $accTk = $this->getAccessToken();
        $ret = $this->vo信息中心->vc公众号->CreateMenu($menu, $accTk);
        return $ret;
    }

} 